[38;2;248;248;242minterface [0m[3;38;2;102;217;239mDisplay[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
[38;2;248;248;242m    [0m[3;38;2;102;217;239mString[0m[38;2;248;248;242m [0m[38;2;248;248;242masText[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m
[38;2;248;248;242m}[0m

[38;2;248;248;242mtrait [0m[3;38;2;102;217;239mEntity[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
[38;2;248;248;242m    [0m[3;38;2;102;217;239mInteger[0m[38;2;248;248;242m id[0m
[38;2;248;248;242m}[0m

[3;38;2;102;217;239mclass[0m[38;2;248;248;242m [0m[38;2;166;226;46mProduct[0m[38;2;248;248;242m [0m[38;2;249;38;114mimplements[0m[38;2;248;248;242m [0m[3;4;38;2;166;226;46mEntity[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;4;38;2;166;226;46mDisplay[0m[38;2;248;248;242m {[0m
[38;2;248;248;242m    [0m[38;2;249;38;114mpublic[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mString[0m[38;2;248;248;242m name[0m
[38;2;248;248;242m    [0m[38;2;249;38;114mpublic[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mBoolean[0m[38;2;248;248;242m available[0m
[38;2;248;248;242m    [0m[38;2;249;38;114mpublic[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mFloat[0m[38;2;248;248;242m price[0m

[38;2;248;248;242m    [0m[38;2;249;38;114mprivate[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mString[0m[38;2;248;248;242m key[0m
[38;2;248;248;242m    [0m[38;2;249;38;114mprotected[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mString[0m[38;2;248;248;242m data[0m

[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m
[38;2;117;113;94m     [0m[38;2;117;113;94m*[0m[38;2;117;113;94m Creates a new product instance.[0m
[38;2;117;113;94m     [0m[38;2;117;113;94m*[0m[38;2;117;113;94m [0m[38;2;249;38;114m@[0m[38;2;249;38;114mparam[0m[38;2;117;113;94m [0m[3;38;2;253;151;31mid[0m[38;2;117;113;94m Product ID.[0m
[38;2;117;113;94m     [0m[38;2;117;113;94m*[0m[38;2;117;113;94m [0m[38;2;249;38;114m@[0m[38;2;249;38;114mparam[0m[38;2;117;113;94m [0m[3;38;2;253;151;31mname[0m[38;2;117;113;94m Product name.[0m
[38;2;117;113;94m     [0m[38;2;117;113;94m*[0m[38;2;117;113;94m [0m[38;2;249;38;114m@[0m[38;2;249;38;114mparam[0m[38;2;117;113;94m [0m[3;38;2;253;151;31mavailable[0m[38;2;117;113;94m Product availability.[0m
[38;2;117;113;94m     [0m[38;2;117;113;94m*[0m[38;2;117;113;94m [0m[38;2;249;38;114m@[0m[38;2;249;38;114mparam[0m[38;2;117;113;94m [0m[3;38;2;253;151;31mprice[0m[38;2;117;113;94m Product price.[0m
[38;2;117;113;94m     [0m[38;2;117;113;94m*[0m[38;2;117;113;94m [0m[38;2;249;38;114m@[0m[38;2;249;38;114mparam[0m[38;2;117;113;94m [0m[3;38;2;253;151;31mkey[0m[38;2;117;113;94m Product key.[0m
[38;2;117;113;94m     [0m[38;2;117;113;94m*[0m[38;2;117;113;94m [0m[38;2;249;38;114m@[0m[38;2;249;38;114mparam[0m[38;2;117;113;94m [0m[3;38;2;253;151;31mdata[0m[38;2;117;113;94m Product internal data.[0m
[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
[38;2;248;248;242m    [0m[38;2;166;226;46mProduct[0m[38;2;248;248;242m([0m[3;38;2;253;151;31mid[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mname[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mavailable[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mprice[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mkey[0m[38;2;248;248;242m = "[0m[3;38;2;253;151;31mkey[0m[38;2;248;248;242m"[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mdata[0m[38;2;248;248;242m = "[0m[3;38;2;102;217;239mint[0m[3;38;2;253;151;31mernal[0m[38;2;248;248;242m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m {[0m
[38;2;248;248;242m        [0m[38;2;255;255;255mthis[0m[38;2;248;248;242m.[0m[38;2;248;248;242mid [0m[38;2;249;38;114m=[0m[38;2;248;248;242m id[0m
[38;2;248;248;242m        [0m[38;2;255;255;255mthis[0m[38;2;248;248;242m.[0m[38;2;248;248;242mname [0m[38;2;249;38;114m=[0m[38;2;248;248;242m name[0m
[38;2;248;248;242m        [0m[38;2;255;255;255mthis[0m[38;2;248;248;242m.[0m[38;2;248;248;242mavailable [0m[38;2;249;38;114m=[0m[38;2;248;248;242m available[0m
[38;2;248;248;242m        [0m[38;2;255;255;255mthis[0m[38;2;248;248;242m.[0m[38;2;248;248;242mprice [0m[38;2;249;38;114m=[0m[38;2;248;248;242m price[0m
[38;2;248;248;242m        [0m[38;2;255;255;255mthis[0m[38;2;248;248;242m.[0m[38;2;248;248;242mkey [0m[38;2;249;38;114m=[0m[38;2;248;248;242m key[0m
[38;2;248;248;242m        [0m[38;2;255;255;255mthis[0m[38;2;248;248;242m.[0m[38;2;248;248;242mdata [0m[38;2;249;38;114m=[0m[38;2;248;248;242m data[0m
[38;2;248;248;242m    }[0m

[38;2;248;248;242m    [0m[38;2;117;113;94m/**[0m[38;2;117;113;94m@[0m
[38;2;117;113;94m     * Returns product data as text.[0m
[38;2;117;113;94m     [0m[38;2;117;113;94m*[0m[38;2;117;113;94m [0m[38;2;249;38;114m@[0m[38;2;249;38;114mreturn[0m[38;2;117;113;94m Data string.[0m
[38;2;117;113;94m     [0m[38;2;117;113;94m*/[0m
[38;2;248;248;242m    [0m[3;38;2;102;217;239mString[0m[38;2;248;248;242m [0m[38;2;166;226;46masText[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m {[0m
[38;2;248;248;242m        [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m [0m[38;2;230;219;116m"""[0m[38;2;230;219;116mID [[0m[38;2;230;219;116m${[0m[38;2;230;219;116mid[0m[38;2;230;219;116m}[0m[38;2;230;219;116m] Name [[0m[38;2;230;219;116m${[0m[38;2;230;219;116mname[0m[38;2;230;219;116m}[0m[38;2;230;219;116m] Available [[0m[38;2;230;219;116m${[0m[38;2;230;219;116mavailable[0m[38;2;230;219;116m}[0m[38;2;230;219;116m] Price [[0m[38;2;230;219;116m${[0m[38;2;230;219;116mprice[0m[38;2;230;219;116m}[0m[38;2;230;219;116m][0m[38;2;230;219;116m"""[0m
[38;2;248;248;242m    }[0m
[38;2;248;248;242m}[0m

[38;2;117;113;94m/*[0m[38;2;117;113;94m Creates a new product instance [0m[38;2;117;113;94m*/[0m
[3;38;2;102;217;239mdef[0m[38;2;248;248;242m product [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;249;38;114mnew[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mProduct[0m[38;2;248;248;242m([0m[38;2;190;132;255m1[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mT-Shirt[0m[38;2;230;219;116m"[0m[38;2;248;248;242m, [0m[38;2;190;132;255mtrue[0m[38;2;248;248;242m, [0m[38;2;190;132;255m15.00[0m[38;2;248;248;242m)[0m

[38;2;102;217;239mprintln[0m[38;2;248;248;242m(product[0m[38;2;248;248;242m.[0m[38;2;248;248;242masText[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m)[0m

[38;2;248;248;242mproduct[0m[38;2;248;248;242m.[0m[38;2;248;248;242mavailable [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255mfalse[0m
[38;2;248;248;242mproduct[0m[38;2;248;248;242m.[0m[38;2;248;248;242mprice [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255m0.0[0m

[38;2;117;113;94m//[0m[38;2;117;113;94m Check values[0m
[38;2;249;38;114massert[0m[38;2;248;248;242m product[0m[38;2;248;248;242m.[0m[38;2;248;248;242masText[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114m==[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mID [1] Name [T-Shirt] Available [false] Price [0.0][0m[38;2;230;219;116m"[0m

[3;38;2;102;217;239mdef[0m[38;2;248;248;242m [0m[38;2;166;226;46mfactorial[0m[38;2;248;248;242m([0m[3;38;2;102;217;239mInteger[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mvalue[0m[38;2;248;248;242m)[0m[38;2;248;248;242m {[0m
[38;2;248;248;242m    [0m[38;2;249;38;114mif[0m[38;2;248;248;242m (value [0m[38;2;249;38;114m<=[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m) [0m[38;2;248;248;242m{[0m
[38;2;248;248;242m        [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m
[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m[38;2;248;248;242m [0m[38;2;249;38;114melse[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
[38;2;248;248;242m        [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m value [0m[38;2;249;38;114m*[0m[38;2;248;248;242m [0m[38;2;248;248;242mfactorial[0m[38;2;248;248;242m([0m[38;2;248;248;242mvalue [0m[38;2;249;38;114m-[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m)[0m
[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m
[38;2;248;248;242m}[0m

[38;2;249;38;114massert[0m[38;2;248;248;242m [0m[38;2;248;248;242mfactorial[0m[38;2;248;248;242m([0m[38;2;190;132;255m5[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114m==[0m[38;2;248;248;242m [0m[38;2;190;132;255m120[0m

[38;2;249;38;114mstatic[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mString[0m[38;2;248;248;242m [0m[38;2;166;226;46mjoin[0m[38;2;248;248;242m([0m[3;38;2;102;217;239mList<String>[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mlist[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mString[0m[38;2;248;248;242m [0m[3;38;2;253;151;31mseparator[0m[38;2;248;248;242m)[0m[38;2;248;248;242m {[0m
[38;2;248;248;242m    [0m[3;38;2;102;217;239mString[0m[38;2;248;248;242m data [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116m"[0m

[38;2;248;248;242m    list[0m[38;2;248;248;242m.[0m[38;2;248;248;242meach [0m[38;2;248;248;242m{[0m[38;2;248;248;242m item [0m[38;2;249;38;114m->[0m
[38;2;248;248;242m        data [0m[38;2;249;38;114m+[0m[38;2;249;38;114m=[0m[38;2;248;248;242m item [0m[38;2;249;38;114m+[0m[38;2;248;248;242m separator[0m
[38;2;248;248;242m    [0m[38;2;248;248;242m}[0m

[38;2;248;248;242m    data [0m[38;2;249;38;114m=[0m[38;2;248;248;242m data[0m[38;2;248;248;242m.[0m[38;2;248;248;242msubstring[0m[38;2;248;248;242m([0m[38;2;190;132;255m0[0m[38;2;248;248;242m,[0m[38;2;248;248;242m data[0m[38;2;248;248;242m.[0m[38;2;248;248;242mlength[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114m-[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m)[0m

[38;2;248;248;242m    [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m data[0m
[38;2;248;248;242m}[0m

[38;2;249;38;114massert[0m[38;2;248;248;242m [0m[38;2;248;248;242mjoin[0m[38;2;248;248;242m([0m[38;2;248;248;242m[[0m[38;2;230;219;116m"[0m[38;2;230;219;116mg[0m[38;2;230;219;116m"[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mr[0m[38;2;230;219;116m"[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mo[0m[38;2;230;219;116m"[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mo[0m[38;2;230;219;116m"[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mv[0m[38;2;230;219;116m"[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116my[0m[38;2;230;219;116m"[0m[38;2;248;248;242m][0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116m [0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114m==[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mg r o o v y[0m[38;2;230;219;116m"[0m
